package org.yelongframework.model.generator;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;
import org.yelongframework.model.generator.interceptor.GFACModelGenerateInterceptor;
import org.yelongframework.model.generator.interceptor.GMATModelGenerateInterceptor;
import org.yelongframework.model.generator.manager.GenFieldAndColumn;
import org.yelongframework.model.generator.manager.GenModelAndTable;
import org.yelongframework.model.generator.manager.wrapper.GenFieldAndColumnWrapper;
import org.yelongframework.model.generator.manager.wrapper.GenModelAndTableWrapper;
import org.yelongframework.model.manager.FieldAndColumn;

/**
 * 抽象实现的模型组件生成器
 * 
 * @since 1.0.0
 */
public abstract class AbstractModelGenerator implements ModelGenerator {

	/** 模型表拦截器 */
	private final List<GMATModelGenerateInterceptor> gmatModelGenerateInterceptors = new ArrayList<>();

	/** 字段列拦截器 */
	private final List<GFACModelGenerateInterceptor> gfacModelGenerateInterceptors = new ArrayList<>();

	// ==================================================拦截器==================================================

	@Override
	public void addModelGenerateInterceptor(GMATModelGenerateInterceptor modelGenerateInterceptor) {
		this.gmatModelGenerateInterceptors.add(modelGenerateInterceptor);
	}

	@Override
	public void addModelGenerateInterceptor(GFACModelGenerateInterceptor modelGenerateInterceptor) {
		this.gfacModelGenerateInterceptors.add(modelGenerateInterceptor);
	}

	// ==================================================执行拦截器==================================================

	/**
	 * 对模型和表、字段通过过滤器进行过滤处理
	 * 
	 * @param genModelAndTable 生成器模型表
	 * @return 过滤处理后的生成器模型表
	 */
	protected GenModelAndTable processInterceptor(GenModelAndTable genModelAndTable) {
		// 模型表拦截器
		if (CollectionUtils.isNotEmpty(gmatModelGenerateInterceptors)) {
			for (GMATModelGenerateInterceptor gmatModelGenerateInterceptor : gmatModelGenerateInterceptors) {
				genModelAndTable = gmatModelGenerateInterceptor.process(genModelAndTable);
			}
		}
		// 字段列拦截器
		if (CollectionUtils.isNotEmpty(gfacModelGenerateInterceptors)) {
			final List<FieldAndColumn> fieldAndColumns = genModelAndTable.getFieldAndColumns();
			final List<GenFieldAndColumn> newGenFieldAndColumns = new ArrayList<>(fieldAndColumns.size());
			for (final FieldAndColumn fieldAndColumn : fieldAndColumns) {
				GenFieldAndColumn genFieldAndColumn = null;
				for (GFACModelGenerateInterceptor gfacModelGenerateInterceptor : gfacModelGenerateInterceptors) {
					if (fieldAndColumn instanceof GenFieldAndColumn) {
						genFieldAndColumn = gfacModelGenerateInterceptor.process((GenFieldAndColumn) fieldAndColumn);
					} else {
						genFieldAndColumn = gfacModelGenerateInterceptor
								.process(new GenFieldAndColumnWrapper(fieldAndColumn));
					}
				}
				// 允许拦截器返回null，返回null时不处理该字段列
				if (null != genFieldAndColumn) {
					newGenFieldAndColumns.add(genFieldAndColumn);
				}
			}
			genModelAndTable = new GenModelAndTableWrapper(genModelAndTable, newGenFieldAndColumns);
			;
		}
		return genModelAndTable;

	}

}
